package com.captain.leetcode.回溯算法;

import java.util.*;

/**
 * 给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。
 * 回文串 是正着读和反着读都一样的字符串。
 */
public class 分割回文串131 {

    List<List<String>> res = new ArrayList<>();
    Deque<String> deque = new ArrayDeque<>();

    public List<List<String>> partition(String s) {
        backTracking(s, 0);
        return res;
    }

    private void backTracking(String s, int startIndex) {
        if (startIndex >= s.length()) {
            res.add(new ArrayList<>(deque));
            return;
        }
        //横向遍历
        for (int i = startIndex; i < s.length(); i++) {
            //1.判断是否为回文字符串
            if (isPalindrome(s,startIndex,i)) {
                deque.add(s.substring(startIndex,i + 1));
            }else continue;
            //2.纵向遍历
            backTracking(s,i+1);
            //3.回退
            deque.removeLast();
        }
    }
    //判断是否是回文串
    private boolean isPalindrome(String s, int startIndex, int end) {
        //先后指针判断
            while (startIndex < end) {
                if (s.charAt(startIndex) != s.charAt(end)) {
                    return false;
                }
                startIndex++;
                end --;
            }
        return true;
    }

    public static void main(String[] args) {
        new 分割回文串131().partition("aab").forEach(System.out::println);
    }
}
